package com.sunday.common.spring.study;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * kafka 加载过程
 * {@link org.springframework.kafka.annotation.KafkaBootstrapConfiguration}
 * <p>
 * dubbo 加载过程
 *
 * {@link org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration}
 * {@link org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig}
 * {@link org.apache.dubbo.config.spring.context.annotation.DubboConfigConfigurationRegistrar#registerBeanDefinitions}
 * {@link org.apache.dubbo.config.spring.context.DubboSpringInitializer#initContext}
 * {@link org.apache.dubbo.config.spring.util.DubboBeanUtils}
 * {@link org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor}
 *
 */
@Slf4j
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * ImportBeanDefinitionRegistrar 是 Spring Framework 提供的一个接口，用于扩展注解驱动的 bean 注册过程。通过实现 ImportBeanDefinitionRegistrar 接口，可以在应用上下文启动时动态注册额外的 bean 定义。
     * 具体来说，当使用 @Import 注解导入一个实现了 ImportBeanDefinitionRegistrar 接口的类时，Spring 在启动时会调用该类的 registerBeanDefinitions() 方法。在该方法中，可以根据需要动态注册 bean 定义，以及指定 bean 的名称、类型和其他属性。
     * 这种机制允许开发人员在运行时基于一些条件或配置，动态地注册 bean 定义，从而实现更高度的灵活性和可扩展性。它常用于处理一些特殊的 bean 定义需求，例如根据环境变量、配置文件或其他条件动态选择不同的实现类进行注册。
     * 总而言之，ImportBeanDefinitionRegistrar 接口允许开发人员在应用上下文启动时根据需要动态注册 bean 定义，以满足特定的配置和条件要求。
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        registry.registerBeanDefinition("myListenerAnnotationBeanPostProcessor",
                new RootBeanDefinition(MyListenerAnnotationBeanPostProcessor.class));

    }

}
